package sorocabaverdedatauploader;

import java.io.BufferedReader;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.sql.*;
import java.util.regex.Pattern;

public class SorocabaVerdeDataUploader {

    private ConnectionSorocabaFactory conn;
    private String usuario, senha;
    private String nomeArquivo;

    SorocabaVerdeDataUploader() {
        this.conn = null;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public void setNomeArquivo(String nomeArquivo) {
        this.nomeArquivo = nomeArquivo;
    }

    // popular banco com arvores do censo
    public void popularCenso() {
        String linha = "", query = "";
        String dataColeta = "";
        String numeroOrdemArv = "";
        String raioCopaArv = "";
        String areaCopaArv = "";
        String numeroProxArv = "";
        String posicaoArv = "";
        String alturaArv = "";
        String alturaBifArv = "";
        String plantioArv = "";
        String danoArv = "";
        String situacaoArv = "";
        String matrizArv = "";
        String nomeRua = "";
        String nomeBairro = "";
        String nomeColetor = "";
        String genero = "";
        String nomeCientifico = "";
        String nomePopular = "";
        String localOrigem = "";
        String enderecoFoto = "";
        String[] vetorValores;
        String indiceAtual = "";
        String regexLetras = "\\D+";
        int ordem = 1;

        // abrir arquivo csv
        try {
            // abre arquivo pra leitura
            File arquivo = new File(this.nomeArquivo);
            FileReader reader = new FileReader(arquivo);
            BufferedReader leitor = new BufferedReader(reader);

            // pega linha inicial vazia
            linha = leitor.readLine();

            // APENAS PARA TESTES
            // INICIAL = indice da linha onde houve erro + 1
            int inicial = 1;
            if (inicial != 1) {
                for (int i = 0; i < inicial; i++) {
                    leitor.readLine();
                }
                indiceAtual = Integer.toString(inicial);
            }

            // pega primeira linha de inserção
            linha = leitor.readLine();

            // conecta ao banco
            this.conn = new ConnectionSorocabaFactory();
            this.conn.setUsuario(this.usuario);
            this.conn.setSenha(this.senha);
            this.conn.connect();

            while (linha != null) {

                vetorValores = null;
                vetorValores = linha.split(";");

                /*
                 * indices linha CENSO:
                 *
                 * 0 - data de coleta 1 - rua 2 - Bairro 3 - coletor 4 - nome
                 * popular 5 - origem 6 - genero 7 - espécie 8 - posição 9 -
                 * numero + próximo 10 - altura total 11 - plantio 12 - dano 13
                 * - altura da bifurcação 14 - raio de copa 15 - area da copa 16
                 * - situacao 17 - matriz
                 */

                // data da coleta
                dataColeta = vetorValores[0];

                // numero de ordem da árvore
                if (vetorValores[1].contentEquals(nomeRua)) {
                    ordem++;
                } else {
                    ordem = 1;
                }
                numeroOrdemArv = Integer.toString(ordem);       // integer

                // raio da copa
                if (Pattern.matches(regexLetras, vetorValores[14])) {
                    raioCopaArv = "0";
                } else {
                    raioCopaArv = vetorValores[14];                 // real
                    raioCopaArv = raioCopaArv.replace(',', '.');
                }

                // area da copa
                if (Pattern.matches(regexLetras, vetorValores[15])) {
                    areaCopaArv = "0";
                } else {
                    areaCopaArv = vetorValores[15];                 // real
                    areaCopaArv = areaCopaArv.replace(',', '.');
                }

                // numero mais proximo
                if (Pattern.matches(regexLetras, vetorValores[9]) || vetorValores[9].contentEquals("0")) {
                    numeroProxArv = "0";                     // integer
                } else {
                    vetorValores[9] = vetorValores[9].trim();
                    numeroProxArv = vetorValores[9].replace(" ", "");
                }

                // posicão da arvore
                if (vetorValores[8].contains("P")) {
                    posicaoArv = "P";                           // char
                } else if (vetorValores[8].contains("I")) {
                    posicaoArv = "I";
                } else if (vetorValores[8].contains("C")) {
                    posicaoArv = "C";
                } else {
                    posicaoArv = "A";
                }

                //altura total
                if (vetorValores[10].contains("A")) {
                    alturaArv = "A";                           // char
                } else if (vetorValores[10].contains("B")) {
                    alturaArv = "B";
                } else {
                    alturaArv = "C";
                }

                // altura da bifurcação
                if (vetorValores[13].contains("A")) {
                    alturaBifArv = "A";                           // char
                } else {
                    alturaBifArv = "B";
                }

                // tipo do plantio
                if (vetorValores[11].contains("C")) {
                    plantioArv = "C";                           // char
                } else {
                    plantioArv = "E";
                }

                // danos
                if (vetorValores[12].contains("C")) {
                    danoArv = "B";                              // char
                    if (vetorValores[12].contains("G") && vetorValores[9].contains("I")) {
                        danoArv = "H";
                    } else if (vetorValores[12].contains("G")) {
                        danoArv = "E";
                    } else if (vetorValores[12].contains("I")) {
                        danoArv = "F";
                    }
                } else if (vetorValores[12].contains("G")) {
                    danoArv = "C";
                    if (vetorValores[12].contains("I")) {
                        danoArv = "G";
                    }
                } else if (vetorValores[12].contains("I")) {
                    danoArv = "D";
                } else {
                    danoArv = "A";
                }

                // situacao
                if (vetorValores[16].contains("M")) {
                    situacaoArv = "M";                           // char
                } else if (vetorValores[16].contains("D")) {
                    situacaoArv = "D";                           // char
                } else {
                    situacaoArv = "A";
                }

                // matriz
                if (vetorValores[17].contains("A")) {
                    matrizArv = "A";                           // char
                } else {
                    matrizArv = "B";
                }

                // rua
                nomeRua = vetorValores[1];                      // varchar(40)
                nomeRua = nomeRua.replace('\'', ' ');

                // bairro
                nomeBairro = vetorValores[2];                   // varchar(40)
                nomeBairro = nomeBairro.replace('\'', ' ');

                // coletor
                nomeColetor = vetorValores[3];                  // varchar(40)
                nomeColetor = nomeColetor.replace('\'', ' ');

                // nome popular
                nomePopular = vetorValores[4];                  // varchar(50)
                nomePopular = nomePopular.replace('\'', ' ');
                nomePopular = nomePopular.replace('0', '-');

                // origem
                if (vetorValores[5].contentEquals("N")) {
                    localOrigem = "B";
                } else if (vetorValores[5].contentEquals("E")) {
                    localOrigem = "A";
                } else if (vetorValores[5].contentEquals("Sub-Esp")) {
                    localOrigem = "C";
                } else if (vetorValores[5].contentEquals("N-End")) {
                    localOrigem = "D";
                } else {
                    localOrigem = "E";
                }

                // genero
                genero = vetorValores[6];                  // varchar(30)
                genero = genero.replace('\'', ' ');

                // especie
                nomeCientifico = vetorValores[7];                  // varchar(50)
                nomeCientifico = nomeCientifico.replace('\'', ' ');

                // montar query
                query = "select inserirArvore('"
                        + dataColeta + "','"
                        + numeroOrdemArv + "','"
                        + raioCopaArv + "','"
                        + areaCopaArv + "','"
                        + numeroProxArv + "','"
                        + posicaoArv + "','"
                        + alturaArv + "','"
                        + alturaBifArv + "','"
                        + plantioArv + "','"
                        + danoArv + "','"
                        + situacaoArv + "','"
                        + matrizArv + "','"
                        + nomeRua + "','"
                        + nomeBairro + "','"
                        + nomeColetor + "','"
                        + genero + "','"
                        + nomeCientifico + "','"
                        + nomePopular + "','"
                        + localOrigem + "','"
                        + enderecoFoto + "');";

                Statement stm = conn.getConn().createStatement();

                ResultSet rs = stm.executeQuery(query);

                rs.next();
                indiceAtual = rs.getString(1);

                if ((Integer.parseInt(indiceAtual) % 500) == 0) {
                    System.out.println("" + indiceAtual);
                }

                // lê proxima linha
                linha = leitor.readLine();

            } // fim while

            arquivo = null;
            leitor.close();
            reader.close();
            this.conn.closeConn();
        } catch (Exception ex) {

            System.out.println("\nERRO linha: " + indiceAtual);
            ex.printStackTrace();
        }
    }

    // popular banco com arvores da amostragem
    public void popularAmostragem() {
        String linha = "", query = "";
        String dataColeta = "";
        String numeroOrdemArv = "";
        String raioCopaArv = "";
        String areaCopaArv = "";
        String numeroProxArv = "";
        String posicaoArv = "";
        String alturaArv = "";
        String alturaBifArv = "";
        String plantioArv = "";
        String danoArv = "";
        String situacaoArv = "";
        String matrizArv = "";
        String nomeRua = "";
        String nomeBairro = "";
        String nomeColetor = "";
        String genero = "";
        String nomeCientifico = "";
        String nomePopular = "";
        String localOrigem = "";
        String enderecoFoto = "";

        //amostragem
        String largura_rua = "";
        String largura_calcada = "";
        String afast_predial = "";
        String ocupacao_bairro = "";
        String caminhamento = "";
        String diametro = "";
        String tipo_poda = "";
        String qualidade_copa = "";
        String qualidade_tronco = "";
        String inclinacao_tronco = "";
        String fitossanidade = "";
        String cabos = "";
        String silvicultura = "";

        String[] vetorValores;
        String indiceAtual = "";
        String regexLetras = "\\D+";;

        // abrir arquivo csv
        try {
            // abre arquivo pra leitura
            File arquivo = new File(this.nomeArquivo);
            FileReader reader = new FileReader(arquivo);
            BufferedReader leitor = new BufferedReader(reader);

            // pega linha inicial vazia
            linha = leitor.readLine();

            // APENAS PARA TESTES
            // INICIAL = indice da linha onde houve erro + 1
            int inicial = 1;
            if (inicial != 1) {
                for (int i = 0; i < inicial; i++) {
                    leitor.readLine();
                }
                indiceAtual = Integer.toString(inicial);
            }

            // pega primeira linha de inserção
            linha = leitor.readLine();

            // conecta ao banco
            this.conn = new ConnectionSorocabaFactory();
            this.conn.setUsuario(this.usuario);
            this.conn.setSenha(this.senha);
            this.conn.connect();

            while (linha != null) {

                vetorValores = null;
                vetorValores = linha.split(";");

                /*
                 * indices linha AMOSTRAGEM:
                 *
                 * 0 - coletor 1 - data 2 - rua 3 - bairro 4 - largura rua 5 -
                 * largura calçada 6 - afastamento predial 7 - ocupação 8 -
                 * posição 9 - numero + proximo 10 - caminhamento 11 - numero
                 * ordem 12 - nome popular 13 - origem 14 - genero 15 - nome
                 * cientifico 16 - altura total 17 - diametro 18 - raio copa 19
                 * - area copa 20 - altura bifurcação 21 - tipo poda 22 -
                 * qualidade copa 23 - qualidade tronco 24 - inclinação tronco
                 * 25 - fitossanidade 26 - danos 27 - cabos 28 - silvicultura 29
                 * - matriz
                 *
                 */
                // data da coleta
                dataColeta = vetorValores[1];

                // numero de ordem da árvore
                numeroOrdemArv = vetorValores[11];      // integer

                // raio da copa
                if (vetorValores[18].contains("A")) {
                    raioCopaArv = "0.5";
                } else if (vetorValores[18].contains("B")) {
                    raioCopaArv = "1.5";
                } else if (vetorValores[18].contains("C")) {
                    raioCopaArv = "2.5";
                } else if (vetorValores[18].contains("D")) {
                    raioCopaArv = "3.5";
                } else if (vetorValores[18].contains("E")) {
                    raioCopaArv = "4.5";
                } else {
                    raioCopaArv = "5.5";
                }

                // area da copa
                if (Pattern.matches(regexLetras, vetorValores[19])) {
                    areaCopaArv = "0";
                } else {
                    areaCopaArv = vetorValores[19];                 // real
                    areaCopaArv = areaCopaArv.replace(',', '.');
                }

                // numero mais proximo
                if (Pattern.matches(regexLetras, vetorValores[9]) || vetorValores[9].contentEquals("0")) {
                    numeroProxArv = "0";                     // integer
                } else {
                    vetorValores[9] = vetorValores[9].trim();
                    numeroProxArv = vetorValores[9].replace(" ", "");
                }

                // posicão da arvore
                if (vetorValores[8].contains("P")) {
                    posicaoArv = "P";                           // char
                } else if (vetorValores[8].contains("I")) {
                    posicaoArv = "I";
                } else if (vetorValores[8].contains("C")) {
                    posicaoArv = "C";
                } else {
                    posicaoArv = "A";
                }

                //altura total
                if (vetorValores[16].contains("A")) {
                    alturaArv = "A";                           // char
                } else if (vetorValores[16].contains("B")) {
                    alturaArv = "B";
                } else {
                    alturaArv = "C";
                }

                // altura da bifurcação
                if (vetorValores[20].contains("A")) {
                    alturaBifArv = "A";                           // char
                } else if (vetorValores[20].contains("B")) {
                    alturaBifArv = "B";                           // char
                } else {
                    alturaBifArv = "C";
                }

                // tipo do plantio
                plantioArv = "C";                           // char

                // danos
                if (vetorValores[26].contains("0")) {
                    danoArv = "A";
                } else if (vetorValores[26].contains("A")) {
                    danoArv = "B";
                } else if (vetorValores[26].contains("B")) {
                    danoArv = "C";
                } else {
                    danoArv = "D";
                }

                // situacao
                situacaoArv = "A";

                // matriz
                if (vetorValores[29].contains("1")) {
                    matrizArv = "A";                           // char
                } else {
                    matrizArv = "B";
                }

                // rua
                nomeRua = vetorValores[2];                      // varchar(40)
                nomeRua = nomeRua.replace('\'', ' ');

                // bairro
                nomeBairro = vetorValores[3];                   // varchar(40)
                nomeBairro = nomeBairro.replace('\'', ' ');

                // coletor
                nomeColetor = vetorValores[0];                  // varchar(40)
                nomeColetor = nomeColetor.replace('\'', ' ');

                // nome popular
                nomePopular = vetorValores[12];                  // varchar(50)
                nomePopular = nomePopular.replace('\'', ' ');
                nomePopular = nomePopular.replace('0', '-');

                // origem
                if (vetorValores[13].contentEquals("N")) {
                    localOrigem = "B";
                } else if (vetorValores[13].contentEquals("E")) {
                    localOrigem = "A";
                } else if (vetorValores[13].contentEquals("Sub-Esp")) {
                    localOrigem = "C";
                } else if (vetorValores[13].contentEquals("End")) {
                    localOrigem = "D";
                } else {
                    localOrigem = "E";
                }

                // genero
                genero = vetorValores[14];                  // varchar(30)
                genero = genero.replace('\'', ' ');

                // especie
                nomeCientifico = vetorValores[15];                  // varchar(50)
                nomeCientifico = nomeCientifico.replace('\'', ' ');

                /*
                 * amostragem
                 */

                //largura da rua 
                largura_rua = vetorValores[4].replace(',', '.');

                // largura da calçada
                largura_calcada = vetorValores[5].replace(',', '.');

                // afastamento predial
                afast_predial = vetorValores[6].replace(',', '.');

                // ocupacao do bairro
                ocupacao_bairro = vetorValores[7];

                // caminhamento
                caminhamento = vetorValores[10];

                // diametro do tronco
                diametro = vetorValores[17].replace('0', 'A');

                // tipo de poda
                tipo_poda = "" + vetorValores[21].charAt(0);

                // qualidade da copa
                qualidade_copa = "" + vetorValores[22].charAt(0);

                // qualidade do tronco
                qualidade_tronco = "" + vetorValores[23].charAt(0);

                // inclinação do tronco
                inclinacao_tronco = "" + vetorValores[24].charAt(0);

                // fitossanidade
                fitossanidade = "" + vetorValores[25].charAt(0);

                // cabos sobre a arvore
                cabos = "" + vetorValores[27].charAt(0);

                // silvicultura
                silvicultura = "" + vetorValores[28].charAt(0);


                // montar query
                query = "select inserirArvoreAmostragem('"
                        + dataColeta + "','"
                        + numeroOrdemArv + "','"
                        + raioCopaArv + "','"
                        + areaCopaArv + "','"
                        + numeroProxArv + "','"
                        + posicaoArv + "','"
                        + alturaArv + "','"
                        + alturaBifArv + "','"
                        + plantioArv + "','"
                        + danoArv + "','"
                        + situacaoArv + "','"
                        + matrizArv + "','"
                        + nomeRua + "','"
                        + nomeBairro + "','"
                        + nomeColetor + "','"
                        + genero + "','"
                        + nomeCientifico + "','"
                        + nomePopular + "','"
                        + localOrigem + "','"
                        + enderecoFoto + "','"
                        + largura_rua + "','"
                        + largura_calcada + "','"
                        + afast_predial + "','"
                        + ocupacao_bairro + "','"
                        + caminhamento + "','"
                        + diametro + "','"
                        + tipo_poda + "','"
                        + qualidade_copa + "','"
                        + qualidade_tronco + "','"
                        + inclinacao_tronco + "','"
                        + fitossanidade + "','"
                        + cabos + "','"
                        + silvicultura + "');";

                Statement stm = conn.getConn().createStatement();

                ResultSet rs = stm.executeQuery(query);

                rs.next();
                indiceAtual = rs.getString(1);

                if ((Integer.parseInt(indiceAtual) % 500) == 0) {
                    System.out.println("" + indiceAtual);
                }

                // lê proxima linha
                linha = leitor.readLine();

            } // fim while

            arquivo = null;
            leitor.close();
            reader.close();
            this.conn.closeConn();
        } catch (Exception ex) {

            System.out.println("\nERRO linha: " + indiceAtual);
            ex.printStackTrace();
        }
    }

    public void select() {
        String query = "";
        try {
            this.conn = new ConnectionSorocabaFactory();
            this.conn.setUsuario(this.usuario);
            this.conn.setSenha(this.senha);
            this.conn.connect();

            query = "SELECT buscaArvore('734');";

            Statement stm = conn.getConn().createStatement();

            ResultSet rs = stm.executeQuery(query);

            while (rs.next()) {
                System.out.println(rs.getString(1));
                System.out.println(rs.getString(2));
            }

            this.conn.closeConn();

        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SorocabaVerdeDataUploader uploader = new SorocabaVerdeDataUploader();

        uploader.setSenha("sorocaba");
        uploader.setUsuario("postgres");

        System.out.println("\nINICIO UPLOAD CENSO\n");
        uploader.setNomeArquivo("D:\\Documentos\\PROJETO SOROCABA VERDE\\DADOS DEFINITIVOS\\censo_utf-8.csv");
        uploader.popularCenso();
        
        System.out.println("\nFIM UPLOAD CENSO\n\nINICIO UPLOAD AMOSTRAGEM\n");
        
        uploader.setNomeArquivo("D:\\Documentos\\PROJETO SOROCABA VERDE\\DADOS DEFINITIVOS\\amostragem_utf-8.csv");
        uploader.popularAmostragem();
        System.out.println("\nFIM UPLOAD AMOSTRAGEM\n");
        
    }
}
